

" 打开 annotate 文件
function! OpenAnnotate()
    set scb
    set crb
    let fname = bufname("%")
    let aname = fnamemodify(fname, ':r').".annotate"

    " 如果自己是 annotate 则关闭
    if fname == aname       
        exe "normal \<c-w>q"
    else
        " 如果自己是最后一个窗口, 则打开新窗口
        let wid = winnr() + 1
        if wid > winnr("$")
            exe "rightbelow vsplit " aname
            wincmd p
        else
            exe wid."wincmd w"
            let fname = bufname("%")
            " 如果下一个窗口, 是 annotate 则关闭
            if aname == fname
                wincmd q
            " 否则, 在下一个窗口中, 编辑 annotate
            else
                exe "ed" aname
                wincmd p
            endif
        endif
    endif
endf

" 设置 annotate
function! SetupAnnotate()
    set scb
    set crb
endf

:au! CursorHold *.[ch] nested call PreviewWord()
:func! PreviewWord()
:  if &previewwindow			" 不要在预览窗口里执行
:    return
:  endif
:  let w = expand("<cword>")		" 在当前光标位置抓词
:  if w =~ '\a'			" 如果该单词包括一个字母
:
:    " 在显示下一个标签之前，删除所有现存的语法高亮
:    silent! wincmd P			" 跳转至预览窗口
:    if &previewwindow		" 如果确实转到了预览窗口……
:      match none			" 删除语法高亮
:      wincmd p			" 回到原来的窗口
:    endif
:
:    " 试着显示当前光标处匹配的标签
:    try
:       exe "ptag " . w
:    catch
:      return
:    endtry
:
:    silent! wincmd P			" 跳转至预览窗口
:    if &previewwindow		" 如果确实转到了预览窗口……
:	 if has("folding")
:	   silent! .foldopen		" 展开折叠的行
:	 endif
:	 call search("$", "b")		" 到前一行的行尾
:	 let w = substitute(w, '\\', '\\\\', "")
:	 call search('\<\V' . w . '\>')	" 定位光标在匹配的单词上
:	 " 给在此位置的单词加上匹配高亮
:      hi previewWord term=bold ctermbg=green guibg=green
:	 exe 'match previewWord "\%' . line(".") . 'l\%' . col(".") . 'c\k*"'
:      wincmd p			" 返回原来的窗口
:    endif
:  endif
:endfun

noremap <Leader>at :call OpenAnnotate()<CR>

augroup AnnotateAutoCmds
    autocmd!
    autocmd BufNewFile,BufReadPost *.annotate :call SetupAnnotate()
augroup end

